"""
图片处理组件
"""

import tkinter as tk
from tkinter import filedialog, messagebox
import numpy as np
from pathlib import Path
from typing import TYPE_CHECKING

from ...utils import FileUtils

if TYPE_CHECKING:
    from ..main_window import MainWindow


class ImageHandlerMixin:
    """图片处理 Mixin 类"""
    
    def load_image(self: 'MainWindow'):
        """加载图片（通过文件对话框）"""
        file_path = filedialog.askopenfilename(
            title="选择图片",
            filetypes=[
                ("图片文件", "*.png *.jpg *.jpeg *.bmp *.tiff"),
                ("所有文件", "*.*")
            ]
        )
        
        if not file_path:
            return
        
        # 使用内部方法加载
        self._load_image_from_path(file_path)
    
    def _load_image_from_path(self: 'MainWindow', file_path: str):
        """从路径加载图片（内部方法）"""
        # 加载图片
        self.image = self.image_processor.load_image(file_path)
        
        if self.image is None:
            messagebox.showerror("错误", "加载图片失败！", parent=self.root)
            return
        
        self.image_path = file_path
        
        # 保存真正的原图（用于最终裁剪）
        self.original_image = self.image.copy()
        
        # 显示图片
        self.display_original_image()
        self.update_status(f"已加载图片: {Path(file_path).name}")
        
        # 清除之前的结果（包括去背景缓存）
        self.image_no_bg = None
        self.clear_selection()
    
    def _get_image_for_clip(self: 'MainWindow') -> np.ndarray:
        """
        获取用于裁剪的图像
        
        Returns:
            np.ndarray: 用于裁剪的图像（优先使用original_image）
        """
        return self.original_image if self.original_image is not None else self.image
    
    def _is_using_channel_mode(self: 'MainWindow') -> bool:
        """
        检查当前是否在使用通道模式
        
        Returns:
            bool: 如果self.image != self.original_image，说明在使用通道模式
        """
        if self.original_image is None:
            return False
        
        # 比较图像是否相同
        return not np.array_equal(self.image, self.original_image)
    
    def _replace_image_with_channel(self: 'MainWindow', channel_image: np.ndarray, channel_config: dict):
        """替换SAM输入图像为通道处理后的图像"""
        try:
            # 保存当前状态到历史（包含SAM输入图）
            self._save_image_replacement_history(channel_image, channel_config)
            
            # 替换SAM输入图像（self.image用于SAM分割）
            self.image = channel_image.copy()
            # 注意：self.original_image 保持不变，用于最终mask裁剪
            
            # 清除当前的分割结果和选择
            self.selected_points = []
            self.selected_labels = []
            self.selected_box = None
            self.current_result = None
            self.current_result_image = None
            
            # 清除画布
            self.original_canvas.delete("selection")
            self.original_canvas.delete("tempbox")
            self.result_canvas.delete("all")
            
            # 重新显示图片（显示通道处理后的图像）
            self.display_original_image()
            
            # 显示通道配置信息
            enabled = []
            weights = channel_config['weights']
            if channel_config['enabled_channels']['r']:
                enabled.append(f"R({weights['r']:.1f})")
            if channel_config['enabled_channels']['g']:
                enabled.append(f"G({weights['g']:.1f})")
            if channel_config['enabled_channels']['b']:
                enabled.append(f"B({weights['b']:.1f})")
            
            channel_info = ', '.join(enabled)
            
            self.update_status(f"✓ 通道模式已启用 (通道: {channel_info}) | 按 Ctrl+Z 可恢复")
            
            self.logger.info(f"SAM输入已替换为通道图像，配置: {channel_config}")
            
            # 提示用户
            messagebox.showinfo(
                "✓ 通道图已应用",
                f"成功！\n\n"
                f"使用通道: {channel_info}\n\n"
                f"📌 工作原理：\n"
                f"1️⃣ SAM分割：基于通道图识别对象\n"
                f"2️⃣ Mask裁剪：应用到原始图像\n"
                f"3️⃣ 最终结果：原图质量的裁剪\n\n"
                f"💡 提示：\n"
                f"• 左侧显示：通道图（SAM看到的）\n"
                f"• 右侧显示：分割结果（叠加在通道图上）\n"
                f"• 导出/裁剪库：使用原图裁剪\n"
                f"• 撤销恢复：Ctrl+Z\n\n"
                f"现在可以使用点选/框选进行分割。",
                parent=self.root
            )
            
        except Exception as e:
            self.logger.error(f"替换通道图失败: {e}", exc_info=True)
            messagebox.showerror("替换失败", f"替换通道图失败：\n\n{e}", parent=self.root)
    
    def _get_processed_mask(self: 'MainWindow', mask: np.ndarray) -> np.ndarray:
        """
        获取处理后的mask（应用平滑处理如果开关打开）
        
        Args:
            mask: 原始mask
        
        Returns:
            np.ndarray: 处理后的mask
        """
        if self.smooth_mask_var.get():
            # 应用平滑处理
            kernel_size = self.config.get('edge_smooth.kernel_size', 5)
            iterations = self.config.get('edge_smooth.iterations', 2)
            return self.image_processor.smooth_mask(mask, kernel_size, iterations)
        else:
            return mask
    
    def _refresh_current_result(self: 'MainWindow'):
        """刷新当前分割结果的显示"""
        if self.current_result is None:
            return
        
        # 获取mask（根据平滑开关决定是否平滑）
        mask = self._get_processed_mask(self.current_result.mask)
        
        # 可视化结果
        result_image = self.image_processor.visualize_mask(self.image, mask)
        self.current_result_image = result_image
        self.display_image(result_image, self.result_canvas)

